
const app= getApp()

Page({

  /**
   * 页面的初始数据
   */
  data: {
    seekDeviceImageSrc: '/image/bluetooth-seek.png',
    isSeekDeviceEnd: false, //默认：false
    isShowSeekDevice: true,
    isCountDown: true, //默认：false
    devices: [],
    countDownNumber: 120, //2分钟 2*60
    setIntervalCountDown: null,

    bluetoothDeviceId: null,
    bluetoothDeviceName:null,
    bluetootheDeviceServices: null,

    /* 配对成功 */
    bluetoothAdapter:false,
    
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    this.openBluetoothAdapter()
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {},

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    /* 移除搜索到新设备的事件的全部监听函数 */
    wx.offBluetoothDeviceFound()
    /* 移除蓝牙适配器状态变化事件的全部监听函数 */
    wx.offBluetoothAdapterStateChange()
    /* 关闭蓝牙 */
    this.closeBluetooth()
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {},

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  },

  /* 初始化蓝牙 */
  openBluetoothAdapter: function () {
    const that = this
    wx.openBluetoothAdapter({
      success: function (res) {
        if (!res.errno) {
          that.startBluetoothDevicesDiscovery()
          return
        }
        wx.showToast({
          title: JSON.stringify(res.errno) + '初始化蓝牙失败！' + JSON.stringify(res.errMsg),
          icon: 'none'
        })
      },
      fail: function (err) {
        if (err.errCode == 10001) {
          that.onBluetoothAdapterStateChange()
          return
        }
        wx.showToast({
          title: JSON.stringify(err.errCode) + '初始化蓝牙失败！' + JSON.stringify(err.errMsg),
          icon: 'none',
        })
      }
    })
  },
  /* 开始搜寻附近的蓝牙外围设备 */
  startBluetoothDevicesDiscovery: function () {
    const that = this
    /* 断开与蓝牙低功耗设备的连接 */
    if (this.data.bluetoothDeviceId) {
      this.closeBLEConnection()
      this.setData({
        bluetoothDeviceId:null
      })
    }
    wx.startBluetoothDevicesDiscovery({
      success: function (res) {
        if (!res.errno) {
          /* 获取在蓝牙模块生效期间所有搜索到的蓝牙设备 */
          let setIntervalCountDown = setInterval(that.getBluetoothDevices, 1000);
          that.setData({
            countDownNumber: 120,
            devices: [],
            isSeekDeviceEnd: false, //默认：false
            isShowSeekDevice: true,
            isCountDown: true,
            setIntervalCountDown
          })
          return
        }
        wx.showToast({
          title: JSON.stringify(res.errno) + '搜索附近蓝牙失败' + JSON.stringify(res.errMsg),
          icon: 'none'
        })
      },
      fail: function (err) {
        wx.showToast({
          title: JSON.stringify(err.errCode) + '搜索附近蓝牙失败' + JSON.stringify(err.errMsg),
          icon: 'none'
        })
      }
    })
  },

  /* 监听搜索到新设备的事件 */
  // onBluetoothDeviceFound: function () {
  //   const that = this
  //   /* 存在不触发调用的可能，有可能是失效API */
  //   wx.onBluetoothDeviceFound(function (res) {
  //     that.getBluetoothDevices()
  //   })
  // },

  /* 获取本机蓝牙适配器状态 */
  // getBluetoothAdapterState: function () {
  //   const that = this
  //   wx.getBluetoothAdapterState({
  //     success: function (res) {
  //       if (res.discovering) {
  //         /* 正在搜索设备--监听设备 */
  //         that.onBluetoothDeviceFound()
  //       } else if (res.available) {
  //         /* 蓝牙适配器可用 */
  //         that.startBeaconDiscovery()
  //       }
  //     },
  //   })
  // },
  /* 监听蓝牙适配器状态变化事件 */
  onBluetoothAdapterStateChange: function () {
    const that = this
    wx.onBluetoothAdapterStateChange(function (res) {
      if (res.available) {
        that.startBluetoothDevicesDiscovery()
      }
    })
  },
  /* 获取在蓝牙模块生效期间所有搜索到的蓝牙设备 */
  getBluetoothDevices: function () {
    const that = this
    wx.getBluetoothDevices({
      success: function (res) {
        // console.log('获取在蓝牙模块生效期间所有搜索到的蓝牙设备',res);
        let devicesList = res.devices.filter(item =>
          item.name.startsWith('TXZ')
        )
        let countDownNumber = --that.data.countDownNumber
        if (countDownNumber > 0) {
          that.setData({
            devices: devicesList,
            countDownNumber,
            isShowSeekDevice: !(devicesList.length),
            isSeekDeviceEnd: false, //默认：false
            isCountDown: true,
          })
          return
        }
        clearInterval(that.data.setIntervalCountDown)
        that.setData({
          devices: devicesList,
          isShowSeekDevice: false,
          isSeekDeviceEnd: false, //默认：false
          isCountDown: false,
          setIntervalCountDown: null,
          countDownNumber: 120
        })
        that.stopBluetoothDevicesDiscovery()

        // if (res.devices.length) {
        //   // clearInterval(that.data.setIntervalCountDown)
        //   that.setData({
        //     devices: res.devices,
        //     countDownNumber: --that.data.countDownNumber,
        //     isShowSeekDevice: false,
        //     isSeekDeviceEnd: false, //默认：false
        //     isCountDown: false,
        //     setIntervalCountDown: null
        //   })
        //   /*  找到要搜索的设备后，及时停止扫描 */
        //   // wx.stopBluetoothDevicesDiscovery({
        //   //   success(res) {
        //   //     console.log('找到要搜索的设备后，及时停止扫描' ,res)
        //   //   }
        //   // })
        // } else if (that.data.countDownNumber > 0) {
        //   let countDownNumber = --that.data.countDownNumber
        //   if (!countDownNumber) {
        //     clearInterval(that.data.setIntervalCountDown)
        //     that.setData({
        //       countDownNumber: 15,
        //       isShowSeekDevice: true,
        //       isSeekDeviceEnd: true,
        //       isCountDown: false,
        //       setIntervalCountDown: null
        //     })
        //     return
        //   }
        //   that.setData({
        //     countDownNumber,
        //   })
        // }
      }
    })
  },
  /* 停止搜寻附近的蓝牙外围设备 */
  stopBluetoothDevicesDiscovery: function () {
    wx.stopBluetoothDevicesDiscovery({
      success(res) {
        console.log('停止搜寻附近的蓝牙外围设备', res)
      }
    })
  },
  /* 根据主服务 UUID 获取已连接的蓝牙设备 */
  getConnectedBluetoothDevices: function () {
    wx.getConnectedBluetoothDevices()
  },
  /* 关闭蓝牙 */
  closeBluetooth: function () {
    if (this.data.bluetoothDeviceId) {
      /* 断开与蓝牙低功耗设备的连接 */
      this.closeBLEConnection()
      /* 关闭蓝牙模块 */
      wx.closeBluetoothAdapter()
      this.setData({
        bluetoothDeviceId: null
      })
    }
  },

  /* 蓝牙信标 Beacon */
  /*开始搜索附近的 Beacon 设备 */
  // startBeaconDiscovery: function () {
  //   const that = this
  //   wx.startBeaconDiscovery({
  //     success: function (res) {
  //       that.getBeacons()
  //     }
  //   })
  // },
  /* 停止搜索附近的 Beacon 设备  */
  // stopBeaconDiscovery: function () {
  //   wx.stopBeaconDiscovery()
  // },
  /* 获取所有已搜索到的 Beacon 设备 */
  // getBeacons: function () {
  //   wx.getBeacons()
  // },


  /* 蓝牙低功耗 蓝牙低功耗设备间要进行通信*/
  /* 连接蓝牙低功耗设备  连接设备:蓝牙低功耗设备间要进行通信，必须首先建立连接*/
  createBLEConnection: function () {
    const that = this
    wx.showLoading({
      title: '连接蓝牙中',
    })
    wx.createBLEConnection({
      deviceId: this.data.bluetoothDeviceId,
      success: function (res) {
        console.log('连接蓝牙低功耗设备', res);
        if (!res.errno || res.errno == -1) {
          that.getBLEDeviceServices()
          return
        }
        wx.hideLoading()
        wx.showToast({
          title: that.data.deviceId + '连接失败' + res.errMsg,
          icon: 'none'
        })
      },
      fail: function (err) {
        wx.hideLoading()
        wx.showToast({
          title: that.data.deviceId + '连接失败' + err.errMsg,
          icon: 'none'
        })
      }
    })
  },
  /* 连接成功，获取服务 */
  getBLEDeviceServices: function () {
    const that = this
    wx.getBLEDeviceServices({
      deviceId: this.data.bluetoothDeviceId,
      success: function (res) {
        if (!res.errno || res.errno == -1) {
          console.log('连接成功，获取服务', res);
          that.setData({
            bluetootheDeviceServices: res.services,
            bluetoothAdapter:true
          })
          app.globalData.bluetoothDevice=res.services
          // 可根据具体业务需要，选择一个主服务进行通信 
          let isPrimaryItem = res.services.find(item => item.isPrimary)
          if (isPrimaryItem) {
            /*读写服务的特征值  */
            that.bluetoothWriterDistinctionServiceValue(isPrimaryItem.uuid)
          }
          return
        }
        wx.showToast({
          title: that.data.deviceId + '获取服务失败' + res.errMsg,
          icon: 'none'
        })
      },
      fail: function (err) {
        wx.hideLoading()
        wx.showToast({
          title: that.data.deviceId + '获取服务失败' + err.errMsg,
          icon: 'none'
        })
      }
    })
  },
  /* 断开与蓝牙低功耗设备的连接 */
  closeBLEConnection: function () {
    wx.closeBLEConnection({
      deviceId: this.data.bluetoothDeviceId
    })
  },
  /* 选中设备绑定 */
  bindBluetoothDevice: function (e) {
    console.log('选中设备绑定', e.currentTarget.dataset.item);
    if (this.data.setIntervalCountDown) {
      clearInterval(this.data.setIntervalCountDown)
      this.setData({
        isShowSeekDevice: false,
        isSeekDeviceEnd: false, //默认：false
        isCountDown: false,
        setIntervalCountDown: null,
        countDownNumber: 120
      })
      this.stopBluetoothDevicesDiscovery()
    }
    /* 断开与蓝牙低功耗设备的连接 */
    if (this.data.bluetoothDeviceId) {
      this.closeBLEConnection()
    }
    this.setData({
      bluetoothDeviceId: e.currentTarget.dataset.item.deviceId,
      bluetoothDeviceName:e.currentTarget.dataset.item.name
    })
    this.createBLEConnection()
  },

  /* 读写服务的特征值 */
  bluetoothWriterDistinctionServiceValue: function (serviceId) {
    const that = this

    //获取蓝牙低功耗设备某个服务中所有特征 
    wx.getBLEDeviceCharacteristics({
      deviceId: this.data.bluetoothDeviceId, // 搜索到设备的 deviceId
      serviceId, // 上一步中找到的某个服务
      success: (res) => {
        wx.hideLoading()
        /* res.characteristics:{
          uuid:'蓝牙设备特征的 UUID',
          properties:{//特征支持的操作
            read:false,//是否支持 read 操作 读
            write:false,//是否支持 write 操作 写
            notify:false,//是否支持 notify 操作 订阅
            indicate:false,//是否支持 indicate 操作 回包
            writeNoResponse:false,//是否支持 writeNoResponse 操作 无回复写
            writeDefault:false,//是否支持 writeDefault 操作
          }
        } */
        console.log('获取蓝牙低功耗设备某个服务中所有特征 ', res);
       
        for (let i = 0; i < res.characteristics.length; i++) {
          let item = res.characteristics[i]
          if (item.properties.write) { // 该特征值可写
            // 本示例是向蓝牙设备发送一个 0x00 的 16 进制数据
            // 实际使用时，应根据具体设备协议发送数据
            let buffer = new ArrayBuffer(1)
            let dataView = new DataView(buffer)
            dataView.setUint8(0, 0)
            /* 向蓝牙低功耗设备特征值中写入二进制数据 */
            wx.writeBLECharacteristicValue({
              deviceId: that.data.bluetoothDeviceId,
              serviceId,
              characteristicId: item.uuid,
              value: buffer,
              success: function (writeRes) {
                console.log('向蓝牙低功耗设备特征值中写入二进制数据', writeRes);
              }
            })
          }
          if (item.properties.read) { // 改特征值可读
            /* 读取蓝牙低功耗设备特征值的二进制数据 */
            wx.readBLECharacteristicValue({
              deviceId: that.data.bluetoothDeviceId,
              serviceId,
              characteristicId: item.uuid,
              success: function (readRes) {
                console.log('读取蓝牙低功耗设备特征值的二进制数据', readRes);
              }
            })
          }
          if (item.properties.notify || item.properties.indicate) {
            /* 监听蓝牙低功耗设备的特征值变化事件 
             *必须先启用 wx.notifyBLECharacteristicValueChange 才能监听到设备 onBLECharacteristicValueChange 事件
             */
            wx.notifyBLECharacteristicValueChange({
              deviceId: that.data.bluetoothDeviceId,
              serviceId,
              characteristicId: item.uuid,
              state: true,
            })
          }
        }
      }
    })
    // 操作之前先监听，保证第一时间获取数据
    wx.onBLECharacteristicValueChange((res) => {
      console.log('操作之前先监听，保证第一时间获取数据', res);
      // 使用完成后在合适的时机断开连接和关闭蓝牙适配器
      // that.closeBluetooth()
    })

  },
  /* 关闭 佳元骑行 */
  closePageContainerTap:function(){
    this.setData({
      bluetoothAdapter:false
    })
  }
})